import pandas as pd

"""
 这个方法的作用是判断 pandas Series（通常是一列数据）中的每个元素是否等于字符串 "t"，返回一个布尔类型的 Series。
 x: pd.Series 是类型注解，表示参数 x 应该是一个 pandas 的 Series 类型 这种写法不会限制传入的类型

 举例
    s = pd.Series(["t", "f", "t"])
    result = _is_true(s)
    print(result)
    # 输出:
    # 0     True
    # 1    False
    # 2     True
    # dtype: bool
"""
def _is_true(x: pd.Series) -> pd.Series:
    #注意这里是向量运算，即对 Series 中的每个元素进行比较，然后再返回一个新的 Series，
    # 这个新的 Series 中的每个元素都是布尔值，表示对应位置的元素是否等于 "t"。
    return x == "t" 


def _parse_percentage(x: pd.Series) -> pd.Series:
    x = x.str.replace("%", "") # 注意是向量化操作
    # 是astype pandas 库中 Series 和 DataFrame 的方法。它的作用是转换数据类型，比如把字符串转换为浮点数、整数等。
    # 空字符串无法直接转换为数字，所以 pandas 会自动变成 NaN。 
    # NaN 是numpy库中的一个特殊值，表示“不是一个数字”（Not a Number）。
    x = x.astype(float) / 100  #注意是向量化操作
    return x


def _parse_money(x: pd.Series) -> pd.Series:
    x = x.str.replace("$", "").str.replace(",", "")
    x = x.astype(float)
    return x


def preprocess_companies(companies: pd.DataFrame) -> pd.DataFrame:
    """Preprocesses the data for companies.

    Args:
        companies: Raw data.
    Returns:
        Preprocessed data, with `company_rating` converted to a float and
        `iata_approved` converted to boolean.
    """
    companies["iata_approved"] = _is_true(companies["iata_approved"]) # 将这个列转换为布尔值
    companies["company_rating"] = _parse_percentage(companies["company_rating"])
    return companies


def preprocess_shuttles(shuttles: pd.DataFrame) -> pd.DataFrame:
    """Preprocesses the data for shuttles.

    Args:
        shuttles: Raw data.
    Returns:
        Preprocessed data, with `price` converted to a float and `d_check_complete`,
        `moon_clearance_complete` converted to boolean.
    """
    shuttles["d_check_complete"] = _is_true(shuttles["d_check_complete"])
    shuttles["moon_clearance_complete"] = _is_true(shuttles["moon_clearance_complete"])
    shuttles["price"] = _parse_money(shuttles["price"])
    return shuttles

# 简单说就是把三个表用inner join连接起来
def create_model_input_table(
    shuttles: pd.DataFrame, companies: pd.DataFrame, reviews: pd.DataFrame
) -> pd.DataFrame:
    """Combines all data to create a model input table.

    Args:
        shuttles: Preprocessed data for shuttles.
        companies: Preprocessed data for companies.
        reviews: Raw data for reviews.
    Returns:
        Model input table.

    """
    # 连接两个表(inner join)
    rated_shuttles = shuttles.merge(reviews, left_on="id", right_on="shuttle_id")
    # 删除id 列，因为合并后，已经有了 shuttle_id 列
    # axis=1 表示删除列，axis=0 表示删除行
    rated_shuttles = rated_shuttles.drop("id", axis=1)

    # 再连接第三个表
    model_input_table = rated_shuttles.merge(
        companies, left_on="company_id", right_on="id"
    )
    # dropna() 只要某行有任意一列为 NaN，就会把这一整行删除掉。
    model_input_table = model_input_table.dropna()
    return model_input_table
